package com.learn.question;

/**
 * @author wangxing
 * @version 2020/8/1 17:48 Administrator
 */
public class Temp20200801 {
    /**
     * 有一个只包含小写字母n和t的字符串s(1<=|s|<=1000000)，其中如果有两个n相邻，那么它们可以合并成一个m，
     * 现在需要你去求这个字符串中，含有多少个'mtm'这样的子序列。
     * 输入一行字符串s
     * 输出这个字符串中所包含的mtm子序列的个数
     * 示例1
     * 输入：
     * "nnntnnn"
     * 输出：
     * 4
     */
    public long countSubStrCount(String str) {
        long count = 0;
        int leftN=0;
        int rightN=0;
        char status = 'a';
        int index = -1;
        char[] chars = str.toCharArray();
        int l = chars.length;
        /**
         * 1.第一个t之前的n数量加载leftN
         * 2.第一个t之后,第二个t之前的n数量加载rightN
         * 3.单次的字符mtm子串数量为 min(leftN,rightN)+1
         * 4.第二个t出现后,将原本rightN赋值给leftN,请空rightN
         */
        for(int i = 0; i < l; i++){
            char c = chars[i];
            if(c == 't'){
                if(i>=1 && chars[i-1] == 't'){
                    leftN = rightN = 0;
                    status = 'e';
                    continue;
                }
                if (status == 'a'){
                    status = 'b';
                }else if(status == 'b' || status == 'e' ){
                    status='c';
                }
                if(status == 'c'){
                    count = count + Math.min(leftN,rightN)+1;
                    leftN=rightN;
                    rightN=0;
                }
            }else{
                if(status == 'a'){
                    leftN++;
                }else{
                    rightN++;
                }
            }
        }
        if(status == 'b'){
            count = Math.min(leftN,rightN)+1;
        }
        return count;
    }
}
